// ============================== 导入依赖 ============================== //

import IS from './is'

// ============================== 导出 JSON 工具 ============================== //

export default {
  /**
   * 转换 JSON
   *
   * @param {*} data 原始数据
   *
   * @returns {Object} JSON 数据 (为空返回 {} )
   */
  json(data) {
    if (IS.isString(data)) return transString(data || '{}', this)
    if (IS.isClassObj(data) || IS.isJSON(data)) return transClassObj(data, this)
    if (IS.isArray(data)) return transArray(data, this)
    return {}
  },
}

// ============================== 内部方法 ============================== //

/**
 * 转换字符串
 *
 * @param {*} data 原始数据
 * @param {Object} CORE 内核库
 *
 * @returns {Object} JSON 数据
 */
const transString = (data, CORE) => {
  let obj = {}

  try {
    obj = JSON.parse(data)
  } catch (err) {
    CORE.logError('转换 JSON', data, err)
  }

  return obj
}

/**
 * 转换类的对象
 *
 * @param {Object} classObj 类的对象
 * @param {Object} CORE 内核库
 *
 * @returns {Object} JSON 数据
 */
const transClassObj = (classObj, CORE) => {
  const obj = { ...classObj }

  Object.keys(obj).forEach((key) => {
    const value = obj[key]
    if (IS.isClassObj(value) || IS.isJSON(value)) obj[key] = transClassObj(value, CORE)
    else if (CORE.isArray(value)) obj[key] = transArray(value, CORE)
  })

  return obj
}

/**
 * 转换数组
 *
 * @param {Array} array 旧的数组
 * @param {Array} CORE 内核库
 *
 * @returns {Array} 新的数组
 */
const transArray = (array, CORE) => {
  return array.map((item) => {
    if (IS.isClassObj(item) || IS.isJSON(item)) return transClassObj(item, CORE)
    if (CORE.isArray(item)) return transArray(item, CORE)
    return item
  })
}
